var createError = require('http-errors');    // 状态错误插件提示 
var express = require('express');  // express 对象
var path = require('path');   // node 自带的 路径模块
var cookieParser = require('cookie-parser'); // 处理cookie
var logger = require('morgan'); // 日志插件 
var session = require("express-session")
var cors = require("cors"); // 解决跨域  cors 
// 引入数据库
require("./utils/connect")

// 路由模块
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var apiRouter = require("./routes/api")
var serviceRouter = require("./routes/service")


var app = express();  // 获取到express所有的方法  

app.use(cors({}))
// view engine setup
app.set('views', path.join(__dirname, 'views')); // __dirname 根目录 把views 重置为 根目录 / 
app.set('view engine', 'ejs');   // 设置模块引擎 ejs

app.use(logger('dev'));   // 记录开发dev 的日志
app.use(express.json());  // 获取 post 请求提交的参数  form 提交
app.use(express.urlencoded({ extended: false })); // ajax 提交  body =>  req.body 
app.use(cookieParser());   // 设置cookies 
app.use(express.static(path.join(__dirname, 'public')));  // express.static 设置express静态文件  把 public  重置为 根目录 /

// app.use() 设置并且使用一个中间件  中间件的本质就是一个函数 中间件调用有先后顺序之分 

app.use((req,res,next)=>{
    console.log("这个是自定义中间件")
    next()
})

app.use(session({
  secret: '2107yyds',
  name: 'test',
  cookie: {maxAge: 2 * 60 *  60000},   // session 临时会话 时长  2h
  resave: false, 
  saveUninitialized: true
}));

// 路由的配置  app.use("路由别名",路由对象)   接口最终路径 = 路由别名 + 接口地址 
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/api', apiRouter);
app.use('/react', serviceRouter);






app.use(function(req,res,next){
    console.log("路由匹配失败---即将进入404 错误 ")
    next()
})

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  // res.render('views/error.ejs'); 
  res.render('error');    // app.render 渲染 ejs模板 
});

module.exports = app;
